home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Programming
/
DiceSource
/
src
/
fsovl
/
zipcomp.c
< prev
Wrap
C/C++ Source or Header
|
1997-09-09
|
2KB
|
132 lines
/*
* (c)Copyright 1992-1997 Obvious Implementations Corp. Redistribution and
* use is allowed under the terms of the DICE-LICENSE FILE,
* DICE-LICENSE.TXT.
*/
/*
* ZIPCOMP.C - ZIP COMPRESSION
*/
#include "defs.h"
#define BITS 14 /* compression size */
Prototype int Compress(BPTR fh, char *buf, long bytes);
Prototype void DeCompress(BPTR fh, char *buf, long bytes);
static long ErrorCode;
static long Fh;
static ubyte *MemBuf;
static long MemBytes;
static ubyte Buf[4096];
static long BufIdx;
static long BufLen;
/* WritePacket(fh, buf, bytes); */
/* ReadPacket(fh, buf, bytes); */
int
Compress(BPTR fh, char *buf, long bytes)
{
int r;
MemBytes = bytes;
MemBuf = buf;
BufIdx = 0;
BufLen = 0;
ErrorCode = 0;
Fh = fh;
r = ZipCompress();
WritePacket(fh, Buf, BufIdx);
return(r);
}
unsigned
zfwrite(void *buf, long blkSize, long numBlks, void *fo)
{
long n = blkSize * numBlks;
while (n) {
long r;
if ((r = sizeof(Buf) - BufIdx) == 0) {
WritePacket(Fh, Buf, sizeof(Buf));
BufIdx = 0;
r = sizeof(Buf);
}
if (n < r)
r = n;
movmem(buf, Buf + BufIdx, r);
buf = (void *)((char *)buf + r);
n -= r;
BufIdx += r;
}
return(numBlks);
}
long
zfread(char *buf, long bytes)
{
long n = (bytes > MemBytes) ? MemBytes : bytes;
movmem(MemBuf, buf, n);
MemBytes -= n;
MemBuf += n;
return(n);
}
void
DeCompress(BPTR fh, char *buf, long bytes)
{
MemBytes = bytes;
MemBuf = buf;
Fh = fh;
BufIdx = 0;
BufLen = 0;
ErrorCode = 0;
ZipDeCompress(MemBuf, MemBytes);
}
int
ReadByte(short *v)
{
if (BufIdx == BufLen) {
BufIdx = 0;
BufLen = ReadPacket(Fh, Buf, sizeof(Buf));
if (BufLen == 0)
return(0);
}
*v = Buf[BufIdx++];
return(8);
}
long
readbuf(ubyte *buf, long n)
{
long ttl = 0;
while (n) {
long r = BufLen - BufIdx;
if (r == 0) {
BufIdx = 0;
BufLen = ReadPacket(Fh, Buf, sizeof(Buf));
if (BufLen == 0)
break;
r = BufLen;
}
if (n < r)
r = n;
movmem(Buf + BufIdx, buf, r);
buf += r;
n -= r;
BufIdx += r;
ttl += r;
}
return(ttl);
}